Why do we need Virtual Memory?

Virtual memory allows programs to be loaded into main memory but be referenced by an a logical address that doesn't exist in main memory. The effect is a dramatically bigger address space that makes overlapping programs impossible because every program is guaranteed to have it's own address space.

We need this because it's essentially a way to map memory stored in secondary storage like a hard-drive to main memory.